/**
 * Created by cuppi on 2017/3/8.
 */
import LocationManager from '../util/LocationManager';
import LocalStorageManager from '../util/LocalStorageManager';
import GlobalConstant from '../util/GlobalConstant.js';
import DateTool from '../tool/DateTool';
import Network from '../../src/network/Network';
import {ALERT} from '../vuex/mutations-types';

class LocationConfig {
  /**
   * 进入APP时获取一次定位（应该只调用一次，在第一次进入APP的时候调用）
   */
  static appPickLocation() {
    return new Promise((resolve, reject) => {
      LocationManager.defaultManager().getLocation().then((location) => {
        let {longitude, latitude} = location;
        Network.cityByCoordinate({longitude, latitude}).then(data => {
          // 获取到定位，获取城市
          this._choiceIfUseCacheLocationCity(data.city);
          resolve(data);
        }, error => {
          console.log(error);
          this._choiceIfUseCacheLocationCity();
          reject(error);
        });
      }, (error) => {
        console.log(error);
        this._choiceIfUseCacheLocationCity();
        reject(error);
      }).catch((error) => {
        console.log(error);
      })
    })
  }

  /**
   * 判断是否使用缓存的城市
   * @param currentCity 当前城市 （可空）
   * @private
   */
  static _choiceIfUseCacheLocationCity(currentCity) {
    if (currentCity) {
      console.log('当前城市:  ' + currentCity.city_name);
      // 更新定位城市
      this._locationCityUse(currentCity);
    } else {
      console.log('当前无法定位到城市');
      this._locationCityUse();
    }
    // 通知定位使用默认的地址,locationCityCache是'LocationCityCache'
    LocalStorageManager.getItem('LocationCityCache', (error, locationCityCache) => {
      // 获取本地城市缓存
      if (error) {
        // 获取本地城市缓存失败
        console.log('获取本地缓存失败' + error);
        if (currentCity) {
          // 更新用户选择城市
          this._userCityUse(currentCity);
        } else {
          // 无定位无缓存，跳转城市选择页
          this._noCityVisible();
        }
      } else {
        console.log('获取本地缓存成功' + locationCityCache);
        locationCityCache = JSON.parse(locationCityCache);
        if (locationCityCache) {
          let lastDate = new Date(locationCityCache.date);
          let city = locationCityCache.city;
          let dateSpace = (DateTool.currentDate().getTime() - lastDate.getTime()) / 1000 / 60 / 60 / 24;
          // 缓存4天的城市
          if (locationCityCache && dateSpace <= 4) {
            // 缓存小于四天，判断使用缓存还是当前定位
            if (currentCity) {
              this._currenCityOrCacheCity(currentCity, city);
            } else {
              this._userCityUse(city);
            }
          } else {
            // 缓存大于四天
            if (currentCity) {
              // 使用当前定位
              this._userCityUse(currentCity);
            } else {
              // 使用默认
              this._noCityVisible();
            }
          }
        } else {
          // 无缓存情况
          if (currentCity) {
            // 使用当前定位
            this._userCityUse(currentCity);
          } else {
            // 使用默认
            this._noCityVisible();
          }
        }
      }
    });
  }

  /**
   * 定位城市使用
   * @param city 使用的定位城市（可空）
   * @private
   */
  static _locationCityUse(city) {
    if (city) {
      GlobalConstant.store.commit('UPDATE_LOCATION_CITY_MUTATION', city);
    } else {
      GlobalConstant.store.commit('UPDATE_LOCATION_CITY_MUTATION');
    }
  }

  /**
   * 用户选择的城市使用
   * @param city 用户选择的城市（可空）
   * @private
   */
  static _userCityUse(city) {
    if (city) {
      GlobalConstant.store.commit('UPDATE_USER_LOCATION_CITY_MUTATION', city);
      LocalStorageManager.setItem('LocationCityCache', JSON.stringify({
        date: DateTool.currentDate(),
        city
      }));
    } else {
      GlobalConstant.store.commit('UPDATE_USER_LOCATION_CITY_MUTATION', city);
    }
  }

  /**
   * 当没有城市可用的情况下
   * @private
   */
  static _noCityVisible() {
    console.log('无定位，无缓存，跳转到城市列表页');
    this._popupCityListView();
  }
  /**
   * 可用的缓存的城市与定位城市冲突
   */
  static _currenCityOrCacheCity(currentCity, city) {
    if (currentCity.id === city.id) {
      this._userCityUse(currentCity);
    } else {
      this._alertUserCacheCity(currentCity, city);
    }
  }

  /**
   * 弹出城市列表页（目前在考虑在这个文件里使用这个是否合适）
   */
  static _popupCityListView() {
    console.log('跳转到城市列表页');
      // GlobalConstant.router.push('city');
  }

  /**
   * 提示用户是否使用缓存的城市（目前在考虑在这个文件里使用这个是否合适）
   * @param currentCity
   * @param city
   */
  static _alertUserCacheCity(currentCity, city) {
    this._userCityUse(city);
    let promptMessage = '定位到您当前所在城市在' + currentCity.city_name + '，是否切换至' + currentCity.city_name + '？';
    GlobalConstant.store.commit(ALERT.CITY_ALERT, {
      title: promptMessage,
      show: true,
      okCallback: () => {
        window.sessionStorage.setItem('UpdateTheLocation', 1);
        this._userCityUse(currentCity);
        GlobalConstant.store.commit(ALERT.CITY_ALERT, {show: false});
      },
      cancelAlert: () => {
        GlobalConstant.store.commit(ALERT.CITY_ALERT, {show: false});
      }
    });
  }
}

export default LocationConfig;
